package com.cskaoyan.javase.method._0introduction;

/**
 * @description: 船新的版本，用方法去复用代码
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 现在有三个需求：
 * - 编写程序，计算10+20，并输出结果
 * - 编写程序，计算111+222，并输出结果
 * - 编写程序，计算333+444，并输出结果
 *
 * 现在需要使用方法来解决需求
 *
 * 1,方法是java当中用来复用代码的特殊机制
 *
 * 2,方法的语法是什么?
 * 语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表){
 * 	//方法体
 * }
 * 在逐一解释每个部分的结构前,我们要先明确两个名词
 *      a,方法的声明(方法头): [修饰符列表] 返回值类型 方法名 (形式参数列表)合起来称之为方法的声明
 *      b,方法的签名: 方法名 (形式参数列表)合起来称之为方法的签名
 * 逐一解释方法的语法当中的各个部分:
 *      1,修饰符列表,指的是那些用来修饰方法的关键字,碍于现在的学习进度,我们默认方法的修饰符列表是public static
 *          但是需要注意的是,修饰符列表对于一个方法而言不是必须的,它可以完全被省略
 *      2,返回值类型,实际上指的是返回值的数据类型,这个数据类型可以是基本数据类型,也可以是引用数据类型
 *          返回值: 方法执行调用完毕后,给出的结果
 *      3,方法名,就是方法的名字,方法在调用执行时,必须有一个名字
 *          方法名也是一个标识符,方法名的命名遵循小驼峰式的命名规范test/myMethod
 *          除此之外,方法名应该是一个正常的单词,并且最好是一个动词,比如getMaxValue
 *          方法名最好见名知意,别人看到你的方法名,应该能够知道这个方法是做什么的
 *      4,形式参数列表,指的是形式参数的列表,它可以是1个,2个,多个.也可以一个都没有
 *          形式参数: 为了让方法的调用者知道调用方法时,需要传入参数的数据类型,以及个数这些信息
 *              所以需要在方法的声明中,给出形式参数
 *              形式参数在传入后,可以在方法中使用,并且它是一个属于方法的局部变量
 *              所以它的语法应该是:
 *              数据类型 变量名
 *              然后如果有多个形参,用逗号隔开","
 *              如果不需要任何参数,可以直接空出来
 *      5,方法体,是方法实现功能所需要的代码集合
 *
 * 3,以上,方法的语法就讲完了,那么怎么定义一个方法呢?
 *       方法应该定义在什么位置?
 *      方法是不能嵌套定义的,方法必须定义在类体中,其它方法之外
 *
 * 4,对于一个有返回值的方法而言,如果在方法的声明中明确了它的返回值类型是一个xxx变量,就需要在方法中指出它的返回值(方法的结果)
 * 用return + 值
 *
 * 5,方法定义完以后,必须在main方法当中去调用它,它才会被执行,这是因为main方法是java程序的入口方法
 *      怎么在main方法中调用其他方法?
 *      对于一个有static修饰的方法,并且是同一个类当中的方法,可以在main方法当中,直接写方法的名字去调用它
 * 对于有形参的方法,必须在调用方法时,明确给出参数
 * 并且这个参数要和形参的数据类型对应,个数相同
 * 这就是所谓的实际参数
 *
 * 6,形式参数和实际参数的区别?
 *   形参是写在方法的声明中,表示方法需要参数的数据类型
 *      形参不是一个真实的值
 *   实参是写在方法调用时的,是给方法传入的一个真实的值
 *
 * 7,对于有返回值的方法,操作它的方法调用,实际上是在操作它的返回值
 *
 *
 * 8,Java当中的方法调用和方法的定义位置有关系吗?
 *      在Java当中是没有关系的
 *      一个类当中定义的所有方法,都是平行的关系
 *      它们之间不会直接互相影响
 *
 * 9,思考:
 *      方法声明中的形参列表可以定义方法传入参数的数据类型,那么这个数据类型在传入实参时,
 *          必须要和形参数据类型保持一致吗?
 *
 *   实际上它并不要求保持一致,而要求数据类型兼容
 *
 *
 */
public class NewDemo {

    public static void main(String[] args) {
        //Result of 'NewDemo.sum()' is ignored
        System.out.println(sum(10, 20));
        int sumValue = sum(1, 1);
        System.out.println(sumValue);
        //.sout的快捷键,可以快速的用输出语句打印一个东西
        System.out.println(sum(666, 777) + 100);
    }

    //定义一个方法,求两个int类型数值的和
    //Access can be private
    //这里报黄同样是idea的小聪明,它认为你这个方法只会在同类中使用,所以可以把它变为私有,不让别人用,但是实际上这不是必须的
    public static int sum(int num1, int num2){
        //Missing return statement
        //Local variable 'sum' is redundant
        /*int sum = num1 + num2;
        return sum;*/
        return num1 + num2;
    }


}
